#include "hublnkhandler.h"
#include "widget.h"
#include "applnk.h"
#include "settinghandler.h"
#include "widget.h"
#include "hubwidget.h"
#include <QDir>


HubLNKHandler::HubLNKHandler(const QString& lnk_dir, const QString& init_file, QWidget* parent_widget)
    : LNKBaseHandler(lnk_dir, init_file, parent_widget)
{
    qDebug() << "HubLNKHandler 创建了";

    /* 执行完本构造函数之后，配置文件的信息和文件夹中有的快捷方式同步，
     * 文件夹中所有存在的快捷方式以AppLNK*的形式添加到了applnk_list中 */

    // 获取文件夹下的所有快捷方式名
    QDir dir(lnk_dir);
    if (! dir.exists())
        dir.mkdir(dir.absolutePath());
    dir.setFilter(QDir::Files);
    auto links_list = dir.entryList();

    // 根据读取的配置文件里的顺序进行初始化
    for (QString& lnk_name : read_all())
    {
        auto index = links_list.indexOf(lnk_name + ".lnk");
        // 如果hub_links文件夹中没有该快捷方式，就不创建，在for循环外面write_all()的时候会把它删除
        if (index != -1)
        {
            auto lnk = create_applnk(lnk_name);
            applnk_list.push_back(lnk);
            // 从lnks_list中去除
            links_list.remove(index);
        }
    }
    // 如果hub_links文件夹子下有该快捷方式，而配置文件里没有，就把它添加到末尾
    for (const auto& lnk_path : links_list)
    {
        auto lnk = create_applnk(lnk_path);
        applnk_list.push_back(lnk);
    }

    write_all();  // 覆盖一下配置文件，去掉hub_links中不存在的快捷方式，增加配置文件中没有的但在hub_links中存在的快捷方式
}

// 创建一个app_lnk
AppLNK* HubLNKHandler::create_applnk(const QString& lnk_name)
{
    AppLNK* app_lnk = new AppLNK(lnk_name, lnk_dir_, parent_widget_);

    // 连接左击事件
    parent_widget_->connect(app_lnk, &AppLNK::left_clicked_me, parent_widget_, [this, app_lnk]()
    {
        HubWidget::open_file(app_lnk->get_absolute_path());
        parent_widget_->hide();
    });
    // 连接移动事件
    parent_widget_->connect(app_lnk, &AppLNK::change_index, parent_widget_, [this, app_lnk](int pos_x, int pos_y)
    {
        auto parent = static_cast<HubWidget*>(parent_widget_);

        auto abs_x = pos_x + parent->x();
        auto abs_y = pos_y + parent->y();
        auto main_widget = static_cast<Widget*> (parent->get_main_widget());
        QRect main_widget_rect(main_widget->x(), main_widget->y(), main_widget->width(), main_widget->height());

        // 拖到主界面中
        if (main_widget_rect.contains(abs_x, abs_y))
        {
            auto index = (abs_x - main_widget->x() + SettingHandler::get_instance()->get_lnk_size() / 2) / SettingHandler::get_instance()->get_dx() - 1;
            if (index > main_widget->get_lnk_handler()->get_size())
                index = main_widget->get_lnk_handler()->get_size();

            if (index >= 0)  // 小于0说明拖到了hub图标上，则不变
            {
                // 添加
                main_widget->get_lnk_handler()->add_lnk(index, app_lnk->get_absolute_path());
                main_widget->refresh_all();
                delete_lnk(app_lnk);
                parent->refresh_all();
            }
        }
        else if (parent->contentsRect().contains(pos_x, pos_y))
        {
            qsizetype lie = (pos_x + SettingHandler::get_instance()->get_lnk_size() / 2) / SettingHandler::get_instance()->get_dx();
            qsizetype line = (pos_y - SettingHandler::get_instance()->get_border_size()) / SettingHandler::get_instance()->get_dx();
            qsizetype new_index = line * 10 + lie;
            if (new_index > get_size())
                new_index = get_size();

            move_lnk(new_index, app_lnk);
            parent->refresh_all();
        }
        else
        {
            delete_lnk(app_lnk);
            static_cast<HubWidget*>(parent_widget_)->refresh_all();
        }

        // 移到了外面
//        if (pox_y < 0 || mouse_pos.y() > parentWidget()->height() - 10 || mouse_pos.x() < 0 || mouse_pos.x() > parentWidget()->width())
//        {
//            delete_lnk(app_lnk->get_name());
//            static_cast<HubWidget*>(parent_widget_)->refresh_all();
//        }



    });

    return app_lnk;
}

HubLNKHandler::~HubLNKHandler()
{
    qDebug() << "HubLNKHandler 销毁了";
}
